package BaseDatos;

import Modelo.Usuario;
import java.util.*;
import java.sql.*;

public class GestorUsuario {

    private String URL_Servidor = "localhost";
    private static final String BASE_DATOS = "ADEHO";
    private static final String LOGIN = "root";
    private static final String PASSWORD = "root";
    private static final String CMD_LISTAR = "SELECT idUsuario, clave, prioridad FROM usuario ORDER BY idUsuario ";
    private static final String CMD_VERIFICAR = "SELECT idUsuario FROM usuario WHERE idUsuario=? AND clave=? ";
    private static final String CMD_INCLUIR = "INSERT into usuario(idUsuario, clave, prioridad)VALUES (?, ?, ?) ";
    private static final String CMD_MODIFICAR = "UPDATE usuario SET clave=? WHERE idUsuario=?";
    private static final String CMD_ELIMINAR = "DELETE FROM usuario WHERE idUsuario=?;";
    private static final String CMD_EXISTE = "SELECT idUsuario FROM usuario WHERE idUsuario=?";

    public ArrayList<Usuario> obtenerLista() {
        ArrayList<Usuario> usuarios = new ArrayList<Usuario>();

        // Abre una conexión a la base de datos y carga la lista de usuarios.
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery(CMD_LISTAR);
            int maxCols = rs.getMetaData().getColumnCount();
            while (rs.next()) {
                Usuario u = new Usuario(rs.getString(1), rs.getString(2), rs.getInt(3));
                usuarios.add(u);
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }

        return usuarios;
    }
    
    public boolean existeUsuario(String user){
        boolean bandera = true;
        ArrayList<Usuario> usuarios = new ArrayList<Usuario>();
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery("SELECT idUsuario FROM usuario WHERE idUsuario='"+user+"';");
            int maxCols = rs.getMetaData().getColumnCount();
            while (rs.next()) {
                Usuario u = new Usuario(rs.getString(1),"",0);
                usuarios.add(u);
            }
            if(usuarios!=null||usuarios.size()<0){
                bandera=false;
            }
        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return bandera;
    }
    
    public Usuario verificarUsuario(String usuario, String clave) {
        GestorBD bd = null;
        Usuario u = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            Statement stm = cnx.createStatement();
            ResultSet rs = stm.executeQuery("SELECT * FROM usuario WHERE idUsuario = '" + usuario + "' AND clave= '" + clave + "'");
            rs.next();
            u = new Usuario(rs.getString("idUsuario"), rs.getString("clave"), rs.getInt("prioridad"));
            stm.close();
        } catch (Exception exc) {
            //exc.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return u;
    }

    public boolean registrarUsuario(Usuario nuevoUsuario) {
        boolean exito = false;
        int registrosActualizados = 0;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx
                    = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);

            PreparedStatement stm = cnx.prepareStatement(CMD_INCLUIR);
            stm.clearParameters();

            stm.setString(1, nuevoUsuario.getIdUsuario());     // id_usuario : String
            stm.setString(2, nuevoUsuario.getClave());     // clave : String
            stm.setInt(3, nuevoUsuario.getPrioridad());          // prioridad: int

            registrosActualizados = stm.executeUpdate();
            exito = registrosActualizados == 1;
            stm.close();

        } catch (Exception e) {
            e.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return exito;
    }

    public boolean modificarUsuario(String usuario, String pass) {
        boolean bandera = false;
        GestorBD bd = null;
        try{
            bd= GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement("UPDATE usuario SET clave='"+ pass+"' WHERE idUsuario='"+usuario+"';");
            stm.executeUpdate();
            stm.close();
            bandera=true;
        } catch (Exception exc) {
            exc.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        } 
            return bandera;
        }
    
    

    public boolean eliminarUsuario(String usuario) {
        boolean bandera = false;
        GestorBD bd = null;
        try {
            bd = GestorBD.obtenerInstancia(URL_Servidor);
            Connection cnx = bd.obtenerConexion(BASE_DATOS, LOGIN, PASSWORD);
            PreparedStatement stm = cnx.prepareStatement(CMD_ELIMINAR);
            stm.clearParameters();
            stm.setString(1, usuario);
            stm.executeUpdate();
            stm.close();
            bandera = true;
        } catch (Exception exc) {
            exc.printStackTrace(System.err);
        } finally {
            bd.cerrarConexion();
        }
        return bandera;
    }

    @Override
    public String toString() {
        return super.toString();
    }

}
